package com.smart.community.user.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.smart.community.commons.result.Result;
import com.smart.community.commons.utils.SecurityUtils;
import com.smart.community.user.service.DashboardService;
import com.smart.community.user.vo.DashboardVO;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;

/**
 * 仪表盘控制器
 * 
 * 提供仪表盘数据查询、缓存管理等功能
 * 
 * @author Wu.Liang
 * @version 2.0.0
 * @since 2025-01-30
 */
@Slf4j
@RestController
@RequestMapping("/user/dashboard")
@Tag(name = "仪表盘", description = "仪表盘相关接口")
public class DashboardController {

    @Autowired
    private DashboardService dashboardService;

    /**
     * 获取仪表盘数据
     * 
     * @return 仪表盘数据
     */
    @GetMapping("/data")
    @Operation(summary = "获取仪表盘数据", description = "获取首页仪表盘统计数据")
    public Result<DashboardVO> getDashboardData() {
        try {
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                log.warn("用户未登录或会话已过期，无法获取仪表盘数据");
                return Result.fail("用户未登录或会话已过期，请重新登录");
            }
            
            log.info("开始获取仪表盘数据，当前用户ID：{}", currentUserId);
            
            DashboardVO dashboardData = dashboardService.getDashboardData(currentUserId);
            
            log.info("获取仪表盘数据成功，当前用户ID：{}", currentUserId);
            return Result.success("获取仪表盘数据成功", dashboardData);
        } catch (Exception e) {
            log.error("获取仪表盘数据失败，错误信息：{}", e.getMessage(), e);
            return Result.fail("获取仪表盘数据失败：" + e.getMessage());
        }
    }
    
    /**
     * 清除当前用户仪表盘数据缓存
     * 
     * @return 操作结果
     */
    @DeleteMapping("/cache")
    @Operation(summary = "清除仪表盘缓存", description = "清除当前用户的仪表盘数据缓存")
    public Result<String> clearDashboardCache() {
        try {
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                log.warn("用户未登录或会话已过期，无法清除缓存");
                return Result.fail("用户未登录或会话已过期，请重新登录");
            }
            
            log.info("开始清除用户仪表盘数据缓存，当前用户ID：{}", currentUserId);
            
            dashboardService.clearDashboardCache(currentUserId);
            
            log.info("清除用户仪表盘数据缓存成功，当前用户ID：{}", currentUserId);
            return Result.success("缓存清除成功");
        } catch (Exception e) {
            log.error("清除用户仪表盘数据缓存失败，错误信息：{}", e.getMessage(), e);
            return Result.fail("清除缓存失败：" + e.getMessage());
        }
    }
    
    /**
     * 清除所有用户仪表盘数据缓存（管理员接口）
     * 
     * @return 操作结果
     */
    @DeleteMapping("/cache/all")
    @Operation(summary = "清除所有仪表盘缓存", description = "清除所有用户的仪表盘数据缓存（管理员接口）")
    public Result<String> clearAllDashboardCache() {
        try {
            Long currentUserId = SecurityUtils.getCurrentUserId();
            if (currentUserId == null) {
                log.warn("用户未登录或会话已过期，无法清除所有缓存");
                return Result.fail("用户未登录或会话已过期，请重新登录");
            }
            
            log.info("开始清除所有用户仪表盘数据缓存，操作用户ID：{}", currentUserId);
            
            dashboardService.clearAllDashboardCache();
            
            log.info("清除所有用户仪表盘数据缓存成功，操作用户ID：{}", currentUserId);
            return Result.success("所有缓存清除成功");
        } catch (Exception e) {
            log.error("清除所有用户仪表盘数据缓存失败，错误信息：{}", e.getMessage(), e);
            return Result.fail("清除所有缓存失败：" + e.getMessage());
        }
    }
}
